<?php

# -- DÉBUT NOTE DE LICENCE -------------------------------------
#
# Ce fichier fait partie de Clicpage.
#
# Copyright (c) 2010 Francois (www.clicpage.net)
# Distribué selon les termes de la licence GPL version 2.0.
# Consultez le fichier LICENCE ou
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- FIN NOTE DE LICENCE ---------------------------------------

class cpModuleUpdate extends cpModuleAdmin
{
	
	
	
	
	
	protected $updater;

	
	
	
	
	/// @name Initialisation
	//@{
	
	
	public function __construct($core)
	{
		parent::__construct($core);   
		$this->setTitreModule(__('Mise à jour de Clicpage'));
		
		# Permission nécessaire: superadmin
		$this->core->auth->verifierPermission('superadmin', true);

		$this->updater = new cpUpdate(CP_UPDATE_URL,'clicpage',CP_UPDATE_VERSION,CP_CHEMIN_CACHE.'/versions');
	}
    //@} 
    
	

	
	
	/// @name Interface du module
	//@{
	
	
	public function interfaceModule()
	{
        
		$p_url = 'index.php?module=update';
		
        # Récupère le numéro de la mise à jour, ou false si aucune mise à jour disponible
        $new_v = $this->updater->check(CP_VERSION);
        
        # Prépare la destination du zip de mise à jour
        $zip_file = $new_v ? CP_RACINE.'/'.basename($this->updater->getFileURL()) : '';
        
        # Étape en cours
        $step = isset($_GET['step']) ? $_GET['step'] : '';
		$step = in_array($step,array('check', 'download','backup','unzip')) ? $step : '';
        
		$archives = array();
		foreach (files::scanDir(CP_RACINE) as $v) {
			if (preg_match('/backup-([0-9A-Za-z\.-]+).zip/',$v)) {
				$archives[] = $v;
			}
		}
		
		# Revert or delete backup file
		if (!empty($_POST['backup_file']) && in_array($_POST['backup_file'],$archives))
		{
			$b_file = $_POST['backup_file'];
			
			try
			{
				if (!empty($_POST['b_del']))
				{
					if (!@unlink(CP_RACINE.'/'.$b_file)) {
						throw new Exception(sprintf(__('Impossible de supprimer le fichier %s'),html::escapeHTML($b_file)));
					}
					http::redirect($p_url);
				}
				
				if (!empty($_POST['b_revert']))
				{
					$zip = new fileUnzip(CP_RACINE.'/'.$b_file);
					$zip->unzipAll(CP_RACINE.'/');
					@unlink(CP_RACINE.'/'.$b_file);
					http::redirect($p_url);
				}
			}
			catch (Exception $e)
			{
				$this->erreurGenerale($e);
			}
		}
		
		# Upgrade process
		if ($new_v && $step)
		{
			try
			{

				switch ($step)
				{
					case 'check':
						$this->updater->checkIntegrity(CP_RACINE.'/inc/digests',CP_RACINE);
						http::redirect($p_url.'&step=download');
						break;
					case 'download':
						$this->updater->download($zip_file);
						if (!$this->updater->checkDownload($zip_file)) {
							throw new Exception(
								sprintf(__('L\'archive téléchargée semble être corrompue. '.
								'Essayer de la <a %s>télécharger</a> à nouveau.'),'href="'.$p_url.'&step=download"')
							);
						}
						http::redirect($p_url.'&step=backup');
						break;
					case 'backup':
						$this->updater->backup(
							$zip_file, 'clicpage/inc/digests',
							CP_RACINE, CP_RACINE.'/inc/digests',
							CP_RACINE.'/backup-'.CP_VERSION.'.zip'
						);
						http::redirect($p_url.'&step=unzip');
						break;
					case 'unzip':
						$this->updater->performUpgrade(
							$zip_file, 'clicpage/inc/digests', 'clicpage',
							CP_RACINE, CP_RACINE.'/inc/digests'
						);
						break;
				}
			}
			catch (Exception $e)
			{
				$msg = $e->getMessage();
				if ($e->getCode() == cpUpdate::ERR_FILES_CHANGED)
				{
					$msg =
					sprintf(
					__('Comme les fichiers suivants de votre installation ont été modifiés, '.
					'votre installation ne peut être mise à jour. '.
					'Merci de <a href="%s">mettre à jour manuellement</a>.'),
					CP_SITE_URL);
				}
				elseif ($e->getCode() == cpUpdate::ERR_FILES_UNREADABLE)
				{
					$msg =
					sprintf(__('Les fichiers suivants de votre installation ne peuvent '.
					'pas être lus. Veuillez corriger ceci ou créer un fichier de backup '.
					'nommé %s manuellement.'),
					'<strong>backup-'.CP_VERSION.'.zip</strong>');
				}
				elseif ($e->getCode() == cpUpdate::ERR_FILES_UNWRITALBE)
				{
					$msg =
					sprintf(
					__('Les fichiers suivants de votre installation ne peuvent pas être '.
					'écrits. Veuillez corriger ceci ou <a href="%s">mettre à jour manuellement</a>'),
					CP_SITE_URL);
				}
				
				if (isset($e->bad_files)) {
					$msg .=
					'<ul><li><strong>'.
					implode('</strong></li><li><strong>',$e->bad_files).
					'</strong></li></ul>';
				}
				
				$this->erreurGenerale(new cpErreur($msg));
			}	
		}
		
		$html =
			$this->afficherMessages();
		
		if (!$step)
		{
			if (empty($new_v))
			{
				$html.= '<p><strong>'.__('Aucune nouvelle version de Clicpage n\'est disponible.').'</strong></p>';
			}
			else
			{
				$html.=
				'<p class="static-msg">'.sprintf(__('Clicpage %s est disponible.'),$new_v).'</p>'.
				
				'<p>'.__('Pour mettre à jour votre installation de Clicpage, cliquez sur le '.
				'bouton suivant. Un fichier de sauvegarde de votre installation actuelle sera '.
				'créé dans votre répertoire principal.').'</p>'.
				'<form action="'.$p_url.'" method="get">'.
				'<p><input type="hidden" name="step" value="check" />'.
				'<input type="hidden" name="module" value="update" />'.
				'<input type="submit" value="'.__('Mettre à jour Clicpage').'" /></p>'.
				'</form>';
			}
			
			if (!empty($archives))
			{
				$html.=
				'<h3>'.__('Sauvegardes des mises à jour').'</h3>'.
				'<p>'.__('Les fichiers suivants sont des sauvegardes de mises à jour précédentes. '.
				'Vous pouvez rétablir votre installation précédente ou supprimer ces fichiers.').'</p>';
				
				$html.=	'<form action="'.$p_url.'" method="post">';
				
				foreach ($archives as $v) {
					$html.=
					'<p><label style="display:block; width:100%;">'.form::radio(array('backup_file'),html::escapeHTML($v)).' '.
					html::escapeHTML($v).'</label></p>';
				}
				
				$html.=
				'<p style="padding-top:30px;"><strong>'.__('Merci de noter que rétablir votre version de Clicpage peut avoir des '.
				'effets non désirés. N\'envisagez ceci que si vous rencontrez d\'importantes difficultés avec cette nouvelle version.').'</strong> '.
				sprintf(__('Vous ne devez pas rétablir une version précédant la dernière (%s).'),end($archives)).
				'</p>'.
				'<p><input type="submit" name="b_del" value="'.__('Supprimer le fichier sélectionné').'" /> '.
				'<input type="submit" name="b_revert" value="'.__('Rétablir le fichier sélectionné').'" />'.
				'</p>'.
				'</form>';
			}
		}
		elseif ($step == 'unzip' && !isset($this->erreurGenerale))
		{
			$html.=
			'<p class="message">'.__("Félicitations, vous êtes à un clic de la fin de la mise à jour.").'</p>'.
			'<p><strong><a href="auth.php?deconnexion=1">'.__('Finir la mise à jour.').'</a></strong></p>';
		}
		
		return $html;
	
	}
	//@}
    
	
}

?>